#ifndef LINKLIST_H
#define LINKLIST_H

template <typename T>
struct LinklistNode
{
    T val;
    LinklistNode *nxt;
    LinklistNode *tail;

    LinklistNode();
    LinklistNode(const T &val);

    void InsertBack(const T &val);
};

template <typename T>
using Linklist = LinklistNode<T>*;

template <typename T>
LinklistNode<T>::LinklistNode() : val(T()), nxt(nullptr) {
    this->tail = this;
}

template <typename T>
LinklistNode<T>::LinklistNode(const T &val) : val(val), nxt(nullptr) {
    this->tail = this;
}

template <typename T>
void LinklistNode<T>::InsertBack(const T &val) {
    LinklistNode *tmp = new LinklistNode(val);
    this->tail->nxt = tmp;
    this->tail = tmp;
}

#endif // LINKLIST_H
